﻿/**
 *      目录处理
 *@author       吴建凰
 *@date         2016年9月20日
 */
#ifndef OSS_DIR_H
#define OSS_DIR_H
#include "ossType.h"
#include <ossString.h>
#include <ossTime.h>

/* Seek method constants 
*		查找方法常量
*/

#define SEEK_CUR    1
#define SEEK_END    2
#define SEEK_SET    0

#ifdef WINDOWS_OS
#define OSS_FILE_SEP "\\"
#else
#define OSS_FILE_SEP "/"
#endif

OSS_EXTERN_BEG
//文件属性定义，参考windows定义
#define OSS_FILE_ATTRIBUTE_READONLY             0x00000001  
#define OSS_FILE_ATTRIBUTE_HIDDEN               0x00000002  
#define OSS_FILE_ATTRIBUTE_SYSTEM               0x00000004  
#define OSS_FILE_ATTRIBUTE_DIRECTORY            0x00000010  
#define OSS_FILE_ATTRIBUTE_ARCHIVE              0x00000020  
#define OSS_FILE_ATTRIBUTE_DEVICE               0x00000040  
#define OSS_FILE_ATTRIBUTE_NORMAL               0x00000080  
#define OSS_FILE_ATTRIBUTE_TEMPORARY            0x00000100  
#define OSS_FILE_ATTRIBUTE_SPARSE_FILE          0x00000200  
#define OSS_FILE_ATTRIBUTE_REPARSE_POINT        0x00000400  
#define OSS_FILE_ATTRIBUTE_COMPRESSED           0x00000800  
#define OSS_FILE_ATTRIBUTE_OFFLINE              0x00001000  
#define OSS_FILE_ATTRIBUTE_NOT_CONTENT_INDEXED  0x00002000  
#define OSS_FILE_ATTRIBUTE_ENCRYPTED            0x00004000  
#define OSS_FILE_ATTRIBUTE_VIRTUAL              0x00010000  

/**
 *      拷贝文件的模式定义
 */
typedef enum
{
    OSS_COPY_COVER,         //覆盖模式
    OSS_COPY_APPEND,        //追加模式
    OSS_COPY_QUIT_IF_EXIST, //存在就放弃
}OssCopyMode;

typedef struct _OssFILETIME {
    DWord dwLowDateTime;
    DWord dwHighDateTime;
}	OssFileTime;

/**
 *      查找到的文件信息
 */
typedef struct OssFindFileData_tag
{
    DWord       dwFileAttributes;
    OssFileTime ftCreationTime;
    OssFileTime ftLastAccessTime;
    OssFileTime ftLastWriteTime;
    DWord       nFileSizeHigh;
    DWord      nFileSizeLow;
    DWord      dwReserved0;
    DWord      dwReserved1;
    char       cFileName[OSS_FILE_NAME_MAX];
    
}OssFindFileData;


/**
 *      查找第一个文件
 */
Handle OssFindFirstFile(char* path,OssFindFileData *ptFindData);


/**
 *      查找下一个文件
 */
Bool OssFindNextFile(Handle hFindFile,OssFindFileData *ptFindData);

/**
 *      关闭查找文件
 */
Bool OssCloseFindFile(Handle hFindFile);

/**
 *      通过路径获取文件名
 *@notes        提取最后一个'/'符号后的名称
 */
const char* OssGetFileName(const char* path);

/**
 *		获取指定文件名的扩展名
 */
const char* OssGetFileExt(const char* fileName);

/**
 *      创建指定的目录
 */
Bool OssCreateDirectory(const char* path);

/**
 *      删除指定的目录及其子目录和所有包含的文件
 */
Bool OssDeleteDirectory(const char* path);

/**
 *      清除指定的目录下所有的子目录和子目录所有包含的文件，保留指定目录
 */
Bool OssClearAllDirectoryFiles(const char* path);

/**
 *      复制源目录到目的目录
 */
Bool OssCopyDirectory(const char* src,const char* dst);

/**
 *      复制源目录到目的目录
 */
Bool OssCopyDirectoryEx(const char* src,const char* dst,OssCopyMode cm = OSS_COPY_APPEND);

/**
 *      删除指定的文件名
 */
Bool OssDeleteFile(const char* path);

/**
 *      拷贝指定目录的文件
 */
Bool OssCopyFile(const char* pcSrcFile,const char* pcDstFile,OssCopyMode tCopyMode);

/**
 *      转移指定文件
 */
Bool OssMoveFile(const char* pcSrcFile,const char* pcDstFile);

/**
 *      获取当前的工作目录
 */
Bool OssGetWorkingDirectory(char abyPath[OSS_MAX_PATH]);

/**
 *      设置当前的工作目录
 */
Bool OssSetWorkingDirectory(const char* szPath);

/**
 *      获取当前模块目录
 *@pathBuf      返回当前模块的目录
 *@iMax         缓冲区最大长度
 *@return       成功返回pathBuf 使用的长度
 *              失败返回0
 */
int OssGetModuleDir(char *pathBuf,int iMax);

/**
 *		获取当前模块名称
 *@pathBuf      返回当前模块的名称
 *@iMax         缓冲区最大长度
 *@return       成功返回pathBuf 使用的长度
 *              失败返回0
 */
int OssGetModuleName(char *pathBuf,int iMax);

/**
 *	    获取当前模块路径
 *@pathBuf      返回当前模块的全路径
 *@iMax         缓冲区最大长度
 *@return       成功返回pathBuf 使用的长度
 *              失败返回0
 */
int OssGetModulePath(char *pathBuf,int iMax);

/**
 *      格式化当前目录(将目录中的/转换为\)
 */
Bool OssFormatPath(char* szPath);

/**
 *      格式化绝对路径(如：把拼接好的绝对路径E://A/B/C../../中的../../或者./去掉)
 *@pcPath       带有相对路径的全路径(注意是全路径)
 *@acAbsPath    返回绝对路径(不带有相对路径的符号)
 *@return          失败则返回FALSE
 */
Bool OssFormatAbsolutePath(char* pcPath, char acAbsPath[OSS_MAX_PATH]);

/**
 *      将相对目录转换为绝对目录
 * *@referencedDir      相对目录的参考目录
 * *@relativePath       相对目录
 * *@acAbsPath          返回绝对路径
 * *@return             
 */
Bool OssGetAbsolutePath(const char* referencedDir,const char* relativePath,OUT char acAbsPath[OSS_MAX_PATH]);

/**
 *		打开文件
 *@filePath	文件路径
 *@mode		打开模式，r,w,a,r+,a+,rb,wb,ab,rb+,ab+
 */
Handle	OssOpenFile(const char* filePath,char* mode);

/**
 *		读文件
 *@hfile	MfhOpenFile的句柄
 *@buff		
 *@nMax		缓冲区最大容量
 *@return	成功返回读取的字节数
 *			失败返回-1
 */
int OssReadFile(Handle hfile, void* buff,int nMax);

/**
 *		写文件
 *@hfile	MfhOpenFile的句柄
 *@writeBuf	需要写入文件的数据
 *@writeBytes	需要写入的字节数
 *@return		成功返回写入的字节数
 *				失败返回-1
 */
int OssWriteFile(Handle hfile,const void* writeBuf,int writeBytes);

/**
 *		定位到文件的指定为止
 *@MoveMethod		相对位移的位置，参考“查找方法常量”
 *@return           如果成功，则该函数返回零，否则返回非零值。
 */
Long64 OssFileSeek (Handle hf, Long64 distance, DWord MoveMethod);

/**
 *		告知当前文件位置
 */
Long64 OssFileTell(Handle hFile);

/**
 *      将文件读取位置重置到开头
 */
void OssRewind(Handle hFile);

/**
 *      关闭打开的文件
 */
Bool OssCloseFile(Handle hFile);

/**
 *      将数据输入文件系统
 */
Bool OssFlushFile(Handle hfile);

/**
 *      将日期转换为文件日期
 */
Bool OssTimeToFileTime(OssTime* pTime,OssFileTime *pFileTime);

/**
 *		将文件日期转换为日期
 */
Bool OssFileTimeToTime(OssFileTime *pFileTime,OssTime* pTime);

/**
 *		获取文件的大小
 */
DWord OssGetFileSize(Handle hFile);

/**
 *      判断目录是否存在
 */
Bool OssIsExistDirectory(const char* szPath);
#define  OssIsExistFile OssIsExistDirectory



OSS_EXTERN_END

#ifdef __cplusplus
/**
 *      根据文件路径获取所在目录的路径
 */
OssString OssGetDirPath(OssString strFilePath);
#endif
#endif

